/*
 * @lc app=leetcode.cn id=242 lang=golang
 *
 * [242] 有效的字母异位词
 */

// 2. 排序+对比
// @lc code=start
func isAnagram(s string, t string) bool {
	s1, s2 := []byte(s), []byte(t)
	sort.Slice(s1, func(i, j int) bool { return s1[i] < s1[j] })
	sort.Slice(s2, func(i, j int) bool { return s2[i] < s2[j] })
	return string(s1) == string(s2)
}

// @lc code=end

// 2. 排序+对比
// 1-3. 哈希
// @lc code=start
func isAnagram(s string, t string) bool {
	if len(s) != len(t) {
		return false
	}
	cnt := map[rune]int{}
	for _, ch := range s {
		cnt[ch]++
	}
	for _, ch := range t {
		cnt[ch]--
		if cnt[ch] < 0 {
			return false
		}
	}
	return true
}

// @lc code=end

// 2. 排序+对比
// 1-2. 哈希
// @lc code=start
func isAnagram(s string, t string) bool {
	if len(s) != len(t) {
		return false
	}

	m := make(map[byte]int)
	for i := 0; i < len(s); i++ {
		m[s[i]]++
	}

	for i := 0; i < len(t); i++ {
		m[t[i]]--
		if m[t[i]] < 0 {
			return false
		}
	}
	return true
}

// @lc code=end

// 1-1. 哈希
// @lc code=start
func isAnagram(s string, t string) bool {
	if len(s) != len(t) {
		return false
	}

	m := make(map[byte]int)
	for i := 0; i < len(s); i++ {
		if v, ok := m[s[i]]; ok {
			m[s[i]] = v + 1
		} else {
			m[s[i]] = 1
		}
	}

	for i := 0; i < len(t); i++ {
		if v, ok := m[t[i]]; ok && v > 0 {
			m[t[i]] = v - 1
		} else {
			return false
		}
	}
	return true
}

// @lc code=end

